package com.gosophia.metadataEngine.service;

import java.util.List;

import com.gosophia.commons.exception.BusinessException;
import com.gosophia.metadataEngine.entity.MetaDataField;

/**
 * 元数据字段api
 * @author mayue
 *
 */
public interface MetaDataFieldService {
     /**
      * 将对接表的字段描述添加到字段表中
      * @param metaDataFields：metaDataTable不能为null
      * @throws BusinessException:当同一个元数据表id下名称，中文名称或属性名称重复时 
      * JC2_YSJ_B_6：系统下存在重复名称/中文名称/属性名称的记录
      */
    public void addMetaDataField(List<MetaDataField> metaDataFields) throws BusinessException;
    /**
     * 修改指定元数据字段：metaDataTable不能为null
     * @param metaDataFields 
     * @throws BusinessException   JC2_YSJ_B_7：元数据字段不能重复
     * @throws ConcurrencyException  JC2_YSJ_C_5：该元数据字段已被删除、JC2_YSJ_C_6：该元数据字段已被修改
     */
    public void updateMetaDataField(MetaDataField metaDataFields)throws BusinessException;

	/**
	 * 根据元数据中系统表id查询该系统表下所有字段（根据配置到元数据表中的id查询接入到系统中的表的字段信息(名称，字段长度)）
	 * @param tableId 系统表id
	 * @return  List<MetaDataField> 系统表下所有字段
	 * @throws BusinessException JC2_YSJ_B_4：指定Id的表不存在、JC2_YSJ_B_5：指定Id对应的数据源无法连接数据库
	 */
	public List<MetaDataField> findSystemFieldByTableId(Long tableId) throws BusinessException;
	
	
	/**
	 * 根据元数据中元数据表id查询该表所有的元数据字段（查询元数据字段表)，按filedOrder排序
	 * @param tableId 元数据系统表编号
	 * @return List<MetaDataField> 元数据字段
	 */
	public List<MetaDataField> findMetaDataFieldByTableId(Long tableId);
	
	/**
	 * 显示指定系统下列表页面应显示的字段（包括hidden字段）按filedOrder排序
	 * @param tableId
	 * @return List<MetaDataField>
	 */
	public List<MetaDataField> findMetaDataFieldByTableIdListShow(Long tableId);
	/**
	 * 显示指定系统下列表页面应显示的字段（不包括hidden字段，用于高级查询）按filedOrder排序
	 * @param tableId
	 * @return List<MetaDataField>
	 */
    public List<MetaDataField> findMetaDataFieldByTableIdListShowNoHidden(Long tableId);
	/**
	 * 显示指定系统下详细页面应显示的字段（包括hidden字段）按filedOrder排序
	 * @param tableId
	 * @return List<MetaDataField>
	 */
    public List<MetaDataField> findMetaDataFieldByTableIdDetailShow(Long tableId);
	/**
	 * 删除指定元数据字段
	 * @param metaDataFieldId
	 * @param version
	 * @throws ConcurrencyException  JC2_YSJ_C_7：该元数据字段已被删除、JC2_YSJ_C_8：该元数据字段已被修改
	 */
	public void removeMetaDataField(Long metaDataFieldId,Long version);
	/**
     * 查询显示列表项
     * @param metaDataTableId 不能为null
     * @return
     */
	public List<MetaDataField> findShowTitleItemsByTableId(Long metaDataTableId);
	/**
     * 获取主键属性名称
     * @param metaDataTableId 不能为null
     * @return
     */
	public String findPrimaryKeyName(Long metaDataTableId);
	/**
     * 查询详细页面显示项
     * @param metaDataTableId 不能为null
     * @return
     */
	public List<MetaDataField> findDetailShowItemsByTableId(Long metaDataTableId);
	/**
	 * 根据fieldId查询元数据属性实体
	 * @param metaDataFieldId 不能为null
	 * @return
	 */
	public MetaDataField findMetaDataFieldByDataFieldId(Long metaDataFieldId);
}
